/*
 * @author=nagebaixiong
 * @version=0.1.0.20230118
 * @createTime=20230118 00:10
 * @lastModifiedTime=20230118 00:10
 * @description=原始内置数据类型
 * 
 * 
 * 算术类型：字符型、整型、布尔型、浮点型
 * 
 * Type             Meaning                                 Minimum Size
 * --------------------------------------------------------------------------------
 * bool             boolean                                 NA
 * char             character                               8 bits
 * wchar_t          wide character                          16 bits
 * char16_t         Unicode character                       16 bits
 * char32_t         Unicode character                       32 bits
 * short            short integer                           16 bits
 * int              integer                                 16 bits
 * long             long integer                            32 bits
 * long long        long integer                            64 bits
 * float            single-precision floating-point         6 significant digits
 * double           double-precision floating-poing         10 significant digits
 * long double      extended-precision floating-poing       10 significant digits
 * 
 * 字符型：
 * ----------------------------------------
 * char是最基本的字符型，大小保证可以容纳一个机器基本字符集的字符，等同于一个单机器字节
 * 剩下的字符型用于扩展字符集
 * 
 * 整型大小关系：
 * ----------------------------------------
 * int >= short
 * long >= int
 * long long >= long
 * 
 * 有符号和无符号类型：
 * ----------------------------------------
 * int、short、long、long long 前面可加unsigned代表无符号，unsigned int可缩写为unsigned
 * 而char与singed char、unsigned char是三种不同的类型，char等价于其他两者中的一个（取决于编译器）
 * 
 * 
 * 类型选用建议：
 * ----------------------------------------
 * 1. 如果你的值不会为负，那么选用unsigned
 * 2. 数字类型选用int（short太小，且实践中long一般等同于int），如果你的值可能大于int则选用long long
 * 3. 不要把char和bool用于算术表达式中，仅把它们用于字符和真假即可。如果你需要一个特别小的整数，
 *    需要标清singed或unsigned
 * 4. 浮点计算使用double类型（float精度不够，且二者计算开销持平，long double提供的精度不确定且开销大）
 * 
 * 
 * C++关键字
 * ---------------------------------------------------------------------------
 * alignas      continue        friend      register            true
 * alignof      decltype        goto        reinterpret_cast    try
 * asm          default         if          return              typedef
 * auto         delete          inline      short               typeid
 * bool         do              int         signed              typename
 * break        double          long        sizeof              union
 * case         dynamic_cast    mutable     static              unsigned
 * catch        else            namespace   static_assert       using
 * char         enum            new         static_cast         virtual
 * char16_t     explicit        noexcept    struct              void
 * char32_t     export          nullptr     switch              volatile
 * class        extern          operator    template            wchar_t
 * const        false           private     this                while
 * constexpr    float           protected   thread_local        while
 * const_cast   for             public      throw
 * 
 */
#include <iostream>


void demo();

int main()
{
    // 类型转换（赋值产生的自动转换）
    bool b = 42;  // 赋值数字给bool值时，0代表false，非0代表true，所以b为true
    int i = b;  // bool转换成数字时，true转换为1，false转换为0，所以i为0
    
    i = 3.14;  // 浮点型赋值给整型时，小数部分将被截断/忽略
    double pi = i;  // 整型赋值给浮点型，小数部分将为0

    unsigned char c = -1;  // 给无符号类型赋值溢出但在有符号类型范围内的，进行取模运算（商趋于负无穷）
    signed char c2 = -19;  // 给有符号类型赋值溢出时，g++编译不通过

    demo();

    return 0;
}

void demo()
{
    // 变量的初始化
    double d1 = 2.3;  // =初始化
    double d2 {2.3};  // 初始化器（在C++中更通用，推荐），窄化转换时会报错（比如向int型赋值浮点数2.3）
    double d3 = {9.3};  // =等于号可选
    std::cout << d1 << ' ' << d2 << ' ' << d3 << std::endl;
}